package com.dts;


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class SearchFile {
    // 当前步骤所在的路径
    public static String filePath = "";

    /**
     * 显示根目录
     */
    public static void showRoots() {
        // 获取根目录所有File对象
        File[] files = File.listRoots();
        //打印所有的根目录
        for (int i = 0; i < files.length; i++) {
            System.out.println(files[i]);
        }
    }

    /**
     * 获取手动输入的命令
     */
    public static String getInputStr() {
        // 定义一个空的字符串
        String inputStr = "";
        //BufferedReader获取输入流的字符对象
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("当前路径:" + filePath);
        try {
            // 获取控制台输入的语句
            inputStr = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 将控制台输入的命令返回
        return inputStr;
    }

    /**
     * 获取当前路径所在的文件对象
     *
     * @param name 输入的文件名
     */
    public static void getFile(String name) {
        // 如果name为空直接提示并返回
        if (name.equals("")) {
            System.out.println("请输入操作命令！");
            SearchFile.getFile(SearchFile.getInputStr());
        }
        // 获取操作语句
        String operateStr = "";
        // 获取操作的文件名
        String fileName = "";
        // 单独输入一单词如:dir、back、esc会报错，直接try catch解决
        try {
            operateStr = name.substring(0, name.indexOf(" "));
            // 打印fileName测试语句
            //System.out.println("operateStr=" + operateStr);
            fileName = name.substring(name.indexOf(" ") + 1);
            // 打印fileName测试语句
            //System.out.println("fileName=" + fileName);
        } catch (Exception e) {
            // 将name直接赋值给operateStr
            operateStr = name;
            // 将name赋值为null
            fileName = null;
        }
        File file = null;// 定义一个File对象的引用，用来接收当前的file对象
        if ("back".equalsIgnoreCase(operateStr)) {// 如果输入的是back
            file = new File(SearchFile.filePath);
            file = file.getParentFile();// 获取上一级路径
            if (file != null) {
                SearchFile.filePath = file.getPath();// 获取上一级路径
            } else {
                // 回到根目录
                SearchFile.filePath = "";
                System.out.println("已经到了根目录，不能再回退了！");
                // 如果文件不存在，显示根路径
                SearchFile.showRoots();
            }
        } else if ("esc".equalsIgnoreCase(operateStr)) {
            //退出程序
            System.out.println("程序结束！");
            System.exit(0);
        } else if ("cd".equalsIgnoreCase(operateStr)) {
            //进入目录
            CD(fileName);
        } else if ("crt".equalsIgnoreCase(operateStr)) {
            //创建文件
            CREATE(fileName);
        } else if ("rm".equalsIgnoreCase(operateStr)) {
            //删除文件
            DEL(fileName);
        } else if ("ls".equalsIgnoreCase(operateStr)) {
            //显示该文件夹下的所有文件和文件夹
            Dir();
        } else if ("lsr".equals(operateStr)) {
            //展示本电脑所有的文件夹及文件
            LSALL();
        } else if ("mkdir".equalsIgnoreCase(operateStr)) {
            //创建文件夹
            MD(fileName);
        } else if ("rmd".equalsIgnoreCase(operateStr)) {
            //移除文件夹
            RD(fileName);
        } else {
            // 命令操作不存在，提示重新输入
            System.out.println("该命令操作不存在，请重新输入！");
        }
        // 递归
        SearchFile.getFile(SearchFile.getInputStr());
    }

    /**
     * 改变目录 进入输入的目录
     *
     * @param fileName
     */
    public static void CD(String fileName) {
        // 创建当前目录下的文件对象
        File file1 = new File(filePath + File.separator + fileName);
        // File file2=null;
        if (file1.exists() && file1.isDirectory()) {
            // 进入目录成功,修改当前所在的路径
            if (filePath.equals("")) {
                //filepath为空，直接将fileName赋值给filePath
                filePath = fileName;
            } else {
                //filepath不为空，拼接路径
                // File.separator：文件路径分割符
                filePath = filePath + File.separator + fileName;
            }
        } else {
            // 提示信息：不是文件夹或文件夹名不存在
            System.out.println("输入不是文件夹或文件夹名不存在！请重新输入");
        }
    }

    /**
     * 根据文件名在此目录下创建文件
     *
     * @param fileName
     */
    public static void CREATE(String fileName) {
        // 创建一个空值文件对象
        File file1 = null;
        // 创建父路径的文件对象
        File file2 = new File(filePath);
        if ("".equals(SearchFile.filePath)) {
            // 根目录下没选择情况下，报出提示信息，并退出到命令行
            System.out.println("请选择根目录！");
            // 打印根目录
            SearchFile.showRoots();
        } else {
            if (fileName.equals("")) {// 如果文件名为空直接提示信息，退回到命令行
                System.out.println("文件名为空，请重新输入！");
            } else {
                // 否则不是根目录，拿当前路径进行拼接
                file1 = new File(SearchFile.filePath + File.separator + fileName);
                if (!file2.isDirectory()) {
                    // 父路径不是文件夹无法创建，报出提示信息，并退出到命令行
                    System.out.println("无法在文件下创建文件，请选择目录！");
                } else if (file1.exists()) {
                    // 文件已存在，无法继续创建，报出提示信息，并退出到命令行
                    System.out.println("该文件已存在，无法继续创建！");
                } else {
                    // 创建文件
                    try {
                        file1.createNewFile();
                        // 创建文件成功,并退出到命令行
                        System.out.println("创建文件成功！");
                    } catch (IOException e) {
                        // 创建文件成功,报错出错信息，并退出到命令行
                        System.out.println("文件格式错误或其它原因，请重新创建！");
                    }
                }
            }
        }
    }

    /**
     * 根据文件名删除该目录下的文件
     *
     * @param fileName
     */
    public static void DEL(String fileName) {
        // 创建一个空值文件对象
        File file1 = null;
        if ("".equals(SearchFile.filePath)) {
            // 根目录下没选择情况下，报出提示信息，并退出到命令行
            System.out.println("请选择根目录！");
            // 打印根目录
            SearchFile.showRoots();
        } else {
            if (fileName.equals("")) {// 如果文件名为空直接提示信息，退回到命令行
                System.out.println("文件名为空，请输入文件名重试");
            } else {
                // 否则不是根目录，拿当前路径进行拼接
                file1 = new File(SearchFile.filePath + File.separator + fileName);
                if (file1.exists() && file1.isDirectory()) {
                    // 父路径不是文件夹无法删除，报出提示信息，并退出到命令行
                    System.out.println("无法删除目录！");
                } else if (file1.exists() && !file1.isDirectory()) {
                    // 文件存在且不是文件夹，删除该文件
                    file1.delete();
                    System.out.println("该文件已被成功删除！");
                }
            }
        }
    }

    /**
     * 显示本目录下所有兄弟目录和文件
     */
    public static void Dir() {
        // 新建当前路径的文件对象
        File file = new File(filePath);
        // 如果文件存在且为文件夹，直接展示文件夹下的内容
        if (file.exists() && file.isDirectory()) {
            showFiles(file);
        }
    }

    /*
     * 显示所有目录和文件
     */
    public static void LSALL() {
        // 获取电脑所有的根目录
        File[] files = File.listRoots();
        for (int i = 0; i < files.length; i++) {
            // 将电脑所有的目录显示出来
            listAllDir(files[i]);
        }
    }

    /**
     * 根据目录名 创建目录
     *
     * @param fileName
     */
    public static void MD(String fileName) {
        // 创建一个空值文件对象
        File file1 = null;
        // 创建父路径的文件对象
        File file2 = new File(filePath);
        if ("".equals(SearchFile.filePath)) {
            // 根目录下没选择情况下，报出提示信息，并退出到命令行
            System.out.println("请选择根目录！");
            // 打印根目录
            SearchFile.showRoots();
        } else {
            if (fileName.equals("")) {// 如果文件名为空直接提示信息，退回到命令行
                System.out.println("文件目录名为空，请重新输入！");
            } else {
                // 否则不是根目录，拿当前路径进行拼接
                file1 = new File(SearchFile.filePath + File.separator + fileName);
                if (!file2.isDirectory()) {
                    // 父路径不是文件夹无法创建，报出提示信息，并退出到命令行
                    System.out.println("请在目录下创建！");
                } else if (file1.exists() && file1.isDirectory()) {
                    // 文件已存在，无法继续创建，报出提示信息，并退出到命令行
                    System.out.println("该文件目录已存在，无法继续创建");
                } else {
                    // 创建文件
                    file1.mkdirs();
                    // 创建文件成功,并退出到命令行
                    System.out.println("创建目录成功！");
                }
            }
        }
    }

    /*
     *根据输入的目录名，移除当前目录下的对应目录及其包含的所有文件夹及文件
     */
    public static void RD(String fileName) {
        // 创建一个空值文件对象
        File file1 = null;
        // 创建父路径的文件对象
        File file2 = new File(filePath);
        if (fileName.equals("")) {
            // 如果文件名为空直接提示信息，退回到命令行
            System.out.println("要删除的文件目录名为空，请重新输入！");
        } else {
            // 拿当前路径进行拼接，
            file1 = new File(SearchFile.filePath + File.separator + fileName);
            if (file1.exists() && file1.isDirectory()) {    // 该文件夹存在
                // 删除文件夹包括文件下的所有东西
                deleteDir(file1);
                //删除成功打印语句
                System.out.println("删除该目录成功！");

            } else {
                // 父路径不是文件夹无法移除条件下的文件夹，报出提示信息，并退出到命令行
                System.out.println("该目录下没有要删除的目标目录！");
            }
        }
    }

    /**
     * 删除传入的文件夹下的所有东西
     *
     * @param file1
     */
    private static void deleteDir(File file1) {
        //列出该文件下的所有文件夹及文件
        File[] files = file1.listFiles();
        //判断该文件下是否有东西
        if (files != null && files.length > 0) {
            //该目录下有文件夹或者文件
            for (int i = 0; i < files.length; i++) {
                //判断这个目录下的所有东西，文件夹--》递归，文件--》删除
                //直到把所有的文件及文件夹删除
                if (files[i].exists() && !files[i].isDirectory()) {
                    files[i].delete();
                } else if (files[i].exists() && files[i].isDirectory()) {
                    //删除该文件夹下的所有东西
                    deleteDir(files[i]);
                    file1.delete();
                }
            }
        } else {
            //判断file1是否存在
            if (file1.exists()) {
                file1.delete();
            }
        }
    }

    /**
     * 将得到的File对象进行显示
     */
    public static void showFiles(File file) {
        if (file != null) {// 文件是否为空
            if (file.exists()) {// 文件是否存在
                if (file.isDirectory()) {// 是否是文件夹
                    File[] files = file.listFiles();
                    if (files != null && files.length > 0) {
                        for (int i = 0; i < files.length; i++) {
                            if (files[i].isDirectory()) {// 是否为文件夹
                                System.out.println(files[i] + "\t文件夹");
                            } else {
                                System.out.println(files[i] + "\t文件");
                            }
                        }
                    } else {
                        System.out.println(file + "\t这个文件夹为空!");
                    }
                } else {
                    System.out.println(file + "\t文件");
                }
            }
        }
    }

    // 显示电脑所有的目录
    public static void listAllDir(File file) {
        // 如果文件存在，且为文件夹，就打印它下面所有的文件和目录
        if (file.exists() && file.isDirectory()) {
            // 打印它下面所有的文件和目录
            showFiles(file);
            //获取该文件夹下所有的文件和文件夹
            File[] files = file.listFiles();
            //判断该文件夹下是否有文件夹和文件
            if (files != null && files.length > 0) {
                for (int i = 0; i < files.length; i++) {
                    //列出改文件下所有的文件夹和文件
                    //文件-->跳过。文件夹-->列出打印再判断
                    if (files[i].exists() && files[i].isDirectory()) {
                        // 递归调用，将该目录下所有的文件和目录再传入函数
                        listAllDir(files[i]);
                    }
                }
            }
        }
    }

    /**
     * 操作命令(直接使用):
     * cd(进入目录)
     * back(返回上一级)
     * ls(展示当前文件夹下的所有文件及目录)
     * lsr(展示电脑所有的文件及目录，不建议使用)
     * crt(创建文件)
     * rm(删除文件)
     * mkdir(创建目录)
     * rmd(移除目录)
     * esc(退出)
     * 请输入命令(命令+空格+文件名或文件夹)如:cd C:\
     */
    public static void main(String[] args) {
        // 打印根目录
        SearchFile.showRoots();
        // 调用获取命令的函数
        SearchFile.getFile(SearchFile.getInputStr());
    }

}

